home *** CD-ROM | disk | FTP | other *** search
/ Scene Storm / Scene Storm - Volume 1.iso / coding / c / unix / src / fstat.c < prev    next >
Encoding:
C/C++ Source or Header  |  1992-08-14  |  1.0 KB  |  50 lines

  1. #include "amiga.h"
  2. #include <dos/dosextens.h>
  3. #include <utility/tagitem.h>
  4. #include <sys/types.h>
  5. #include <sys/stat.h>
  6. #include <amiga/ioctl.h>
  7.  
  8. int fstat(int fd, struct stat *sbuf)
  9. {
  10.   BPTR fh;
  11.   struct FileInfoBlock *fib;
  12.   int ret;
  13.  
  14.   chkabort();
  15.   if (ioctl(fd, _AMIGA_GET_FH, &fh) == -1) return -1;
  16.   if ((fib = AllocDosObjectTags(DOS_FIB, TAG_END)) && ExamineFH(fh, fib))
  17.     {
  18.       _fibstat(fib, 0, sbuf);
  19.       ret = 0;
  20.     }
  21.   else
  22.     {
  23.       int err = IoErr();
  24.  
  25.       if (err == ERROR_ACTION_NOT_KNOWN)
  26.     /* Fake a stat result */
  27.     {
  28.       ret = 0;
  29.       sbuf->st_dev = (long)(((struct FileHandle *)BADDR(fh))->fh_Type);
  30.       sbuf->st_ino = 0;
  31.       sbuf->st_mode = 0777;
  32.       sbuf->st_nlink = 1;
  33.       sbuf->st_uid = AMIGA_UID; sbuf->st_gid = AMIGA_GID;
  34.       sbuf->st_blksize = 512;
  35.       sbuf->st_blocks = 0;
  36.       sbuf->st_size = 0;
  37.       /* 1-Jan-1978 */
  38.       sbuf->st_ctime = sbuf->st_atime = sbuf->st_mtime = 252460800;
  39.     }
  40.       else
  41.     {
  42.       ret = -1;
  43.       errno = convert_oserr(err);
  44.     }
  45.     }
  46.   if (fib) FreeDosObject(DOS_FIB, fib);
  47.   ioctl(fd, _AMIGA_FREE_FH, &fh);
  48.   return ret;
  49. }
  50.